package br.urca.controller.webservice;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.Consumes;
import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.view.Results;
import br.urca.dao.AlunosCursoDAO;
import br.urca.dao.DisciplinaDAO;
import br.urca.dao.DisciplinasCursadasDAO;
import br.urca.dao.DisciplinasMatriculadasDAO;
import br.urca.dao.OfertaDAO;
import br.urca.model.AlunoCurso;
import br.urca.model.Disciplina;
import br.urca.model.DisciplinaCursada;
import br.urca.model.DisciplinaMatriculada;
import br.urca.model.Oferta;
import br.urca.model.json.AlunoNota;
import br.urca.model.json.AlunoNotaPOST;
import br.urca.model.json.DisciplinaComOferta;
import br.urca.model.json.Retorno;

@Controller
public class WSLancamentoNotasController {

	private AlunosCursoDAO mAlunoCursoDAO;
	private DisciplinasMatriculadasDAO mMatriculadasDAO;
	private DisciplinasCursadasDAO mCursadasDAO;
	private DisciplinaDAO mDisciplinaDAO;
	private OfertaDAO mOfertaDAO;
	private Result result;
	HttpServletRequest request;
	
	private List<AlunoNota> listaAlunos = new ArrayList<AlunoNota>();

	public WSLancamentoNotasController() {
	}

	@Inject
	public WSLancamentoNotasController(AlunosCursoDAO mAlunoCursoDAO, DisciplinasCursadasDAO mCursadasDAO,
			DisciplinasMatriculadasDAO mMatriculadasDAO, HttpServletRequest request,
			DisciplinaDAO mDisciplinaDAO, OfertaDAO mOfertaDAO, Result result) {
		super();
		this.mAlunoCursoDAO = mAlunoCursoDAO;
		this.mCursadasDAO = mCursadasDAO;
		this.mMatriculadasDAO = mMatriculadasDAO;
		this.mDisciplinaDAO = mDisciplinaDAO;
		this.mOfertaDAO = mOfertaDAO;
		this.result = result;
		this.request = request;
	}

	@Post("/lancamentoNotas")
	@Consumes("application/json")
	public void salvar(List<AlunoNotaPOST> mList) {
		if ((mList != null) && (!mList.isEmpty())) {
			Retorno retorno;
			try {
				for (AlunoNotaPOST mAlunoNotaPOST: mList) {
					DisciplinaMatriculada dm = mMatriculadasDAO
							.buscarPorOfertaPedidoMatricula(mAlunoNotaPOST.getOferta(), 
									mAlunoNotaPOST.getPedido(), mAlunoNotaPOST.getMatricula());
					if (dm != null) {					
						dm.setNotaAV1(mAlunoNotaPOST.getNotaAv1());
						dm.setNotaAV2(mAlunoNotaPOST.getNotaAv2());
						mMatriculadasDAO.atualizar(dm);
					}
				}	
				retorno = new Retorno(true, "");
				this.result.use(Results.json()).from(retorno, "resposta").serialize();
			} catch(Exception e) {
				retorno = new Retorno(false, e.getMessage());
				this.result.use(Results.json()).from(retorno, "resposta").serialize();
			}
		}
	}
	
	@Get("/buscardisciplinapornome/{nome},{oferta}")
	public void buscarDisciplinaPorNome(String nome, String oferta) {
		if (nome != null) {
			Properties properties = new Properties();
			String mNome = null;
			String mOferta = null;
			
			try {
				properties.load(new StringReader(nome));
				mNome = properties.getProperty("nome");
				
				properties.load(new StringReader(oferta));
				mOferta = properties.getProperty("oferta");
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			if (mNome != null) {
				List<Disciplina> mList = mDisciplinaDAO.buscarPorNome(mNome);
				if ((mList != null) && (!mList.isEmpty())) {
					
					List<Oferta> mListOfertas = new ArrayList<Oferta>();
					List<DisciplinaComOferta> mListDisciplinaComOfertas = 
							new ArrayList<DisciplinaComOferta>();
					mListOfertas.clear();
					
					for(Disciplina d: mList) {
						mListOfertas.addAll(
								mOfertaDAO.buscarPorOfertaDisciplina(mOferta, d.getCodDisciplina()));
						for(Oferta o: mListOfertas) {
							mListDisciplinaComOfertas.add(new DisciplinaComOferta(o, d.getNomeDisciplina()));
						}
						mListOfertas.clear();
					}
					
					this.result.use(Results.json())
						.from(mListDisciplinaComOfertas, "resposta").include("id")
						.serialize();
				} else {
					this.result.use(Results.json())
						.from(new ArrayList<>(), "resposta")
						.serialize();
				}
			}
			
		}
	}

	@Get("/lancamentoNotas/{oferta},{pedido}")
	public void listarAlunosParaNotas(String oferta, String pedido) {
		if ((oferta != null) && (pedido != null)) {

			Properties properties = new Properties();

			String mOferta = null;
			String mPedido = null;
			Oferta of = null;

			try {
				// pega somente os números da matrícula
				properties.load(new StringReader(oferta));
				mOferta = properties.getProperty("oferta");

				properties.load(new StringReader(pedido));
				mPedido = properties.getProperty("pedido");
			} catch (IOException e) {
				e.printStackTrace();
			}
			if ((mOferta != null) && (mPedido != null)) {
				of = mOfertaDAO.buscarPorOfertaPedido(mOferta, mPedido);

				if (of != null) {
					List<DisciplinaMatriculada> mListDisciplinas = mMatriculadasDAO
							.buscarPorOferta(of);

					AlunoCurso alunoCurso;
					Disciplina disciplina = null;
					AlunoNota alunoNota;
					
					listaAlunos = new ArrayList<AlunoNota>();

					for (DisciplinaMatriculada dm : mListDisciplinas) {

						alunoCurso = mAlunoCursoDAO.buscaPorMatricula(dm
								.getId().getMatricula());

						disciplina = mDisciplinaDAO.buscarPorId(of
								.getCodDisciplina());
						try {
							alunoNota = new AlunoNota(alunoCurso.getAluno().getNome(),
									alunoCurso.getMatricula(), 
									(dm.getNotaAV1() != null ? 
											String.valueOf(dm.getNotaAV1()) : null),
									(dm.getNotaAV2() != null ? 
											String.valueOf(dm.getNotaAV2()) : null), 
									(dm.getNotaAVF() != null ? 
											String.valueOf(dm.getNotaAVF()) : null),
									(dm.getMedia() != null ?		
											String.valueOf(dm.getMedia()) : null),
									disciplina.getNomeDisciplina());
							this.listaAlunos.add(alunoNota);
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}				
				if (!listaAlunos.isEmpty()) {
					Collections.sort(listaAlunos, AlunoNota.POR_NOME);
					this.result.use(Results.json())
							.from(listaAlunos, "resposta").recursive()
							.serialize();
				} else {
					this.result.use(Results.json())
							.from(new ArrayList<>(), "resposta").recursive()
							.serialize();
				}
			}
		}
	}

}
